export type BaseFormReference = {
  // 方法：清除某个表单的校验信息
  clearValidate: (prop: string) => void;
  // 方法：修改表单某项数据
  updateFormData: (prop: string, value: any) => void;
  // 方法：修改表单所有数据
  updateForm: (form: any) => void;
  // 方法：重置表单
  reset: () => void;
  // 方法：立刻检验表单
  runValidate: () => void;
  // 属性：表单数据
  formData: any;
};

export type BaseFormColumns = FormColumnsItem[];

export type FormColumnsItem = CommonFormColumnsItem &
  InputFormColumnsItem &
  NumberFormColumnsItem &
  SelectFormColumnsItem &
  DateTimeFormColumnsItem &
  UploadFormColumnsItem;

export type BaseFormColumnsType =
  | "input"
  | "number"
  | "select"
  | "multipleSelect"
  | "filterable"
  | "radio"
  | "cascader"
  | "time"
  | "timeRange"
  | "date"
  | "dateTime"
  | "dateRange"
  | "dateTimeRange"
  | "uploadFile"
  | "uploadImage"
  | "textarea"
  | "slot";

type CommonFormColumnsItem = {
  // 表单字段名
  prop?: string;
  // 表单字段标题
  label?: string;
  // 表单字段类型
  type?: BaseFormColumnsType;
  // 表单校验规则
  rules?: FormRuleItem[];
  // 是否显示表单项
  isShow?: boolean;
  // 表单项默认值
  defaultValue?: any;
  // 表单项是否必填
  required?: boolean;
  // 是否显示清除按钮
  clearable?: boolean;
  // 占位符文字
  placeholder?: string;
  // 是否禁用
  disabled?: boolean;
  // 表单项宽度布局配置
  span?: number;
  // 绑定的额外事件
  events?: any;
  // 绑定的额外属性
  props?: any;
};

type InputFormColumnsItem = {
  // 表单检验类型
  valueType?:
    | "PHONE"
    | "TEL"
    | "CARD"
    | "EMAIL"
    | "PAYMENT"
    | "PASSWORD"
    | "CODE"
    | "SORT"
    | "ZH_CN"
    | "PERMISSION_CODE"
    | "PRICE"
    | "TEL_AND_PHONE"
    | "MONEY";
  // 禁用valueType表单检验类型
  cancelValueTypeValidator?: boolean;
  // 表单字符串最大长度（超过禁止输入）
  max?: number;
  // 表单字符串最小长度（低于校验提示）
  min?: number;
  // 表单后置修饰文本
  append?: string;
  // 表单前置修饰文本
  prepend?: string;
};

type NumberFormColumnsItem = {
  // 数字输入框最大值
  max?: number;
  // 数字输入框最小值
  min?: number;
  // 数字输入框精度
  precision?: number;
  // 数字输入框步长
  step?: number;
  // 是否显示控制按钮
  controls?: boolean;
  // 是否显示为输入框样式
  inputStyle?: boolean;
};

type SelectFormColumnsItem = {
  // 当输入框type为select或multipleSelect时的下拉框数组
  options?: OptionItem[];
  // 当输入框type为filterable时的远程搜索方法实例
  remoteMethod?: Function;
};

type DateTimeFormColumnsItem = {
  // 当输入框type为date、dateRange时的日期格式化
  format?: string;
  // 当输入框type为dateRange时的起始框占位符文字
  startPlaceholder?: string;
  // 当输入框type为dateRange时的结束框占位符文字
  endPlaceholder?: string;
  // 当输入框type为dateRange时限制选择的最早日期
  startDate?: string;
  // 当输入框type为dateRange时限制选择的最晚日期
  endDate?: string;
  // 当输入框type为dateRange时的起始接口字段名
  firstProp?: string;
  // 当输入框type为dateRange时的结束接口字段名
  secondProp?: string;
};

type UploadFormColumnsItem = {
  // 文件上传配置
  uploadConfig?: UploadConfig;
};

type FormRuleItem = {
  // 字符串最大长度 / 数字最大值
  max?: number;
  // 字符串最小长度 / 数字最小值
  min?: number;
  // 数字最大值（不包含此值）
  maxExclusive?: number;
  // 数字最小值（不包含此值）
  minExclusive?: number;
  // 是否必填
  required?: boolean;
  // 正则表达式
  pattern?: RegExp;
  // 自定义校验
  validator?: (rule: any, value: any, callback: any) => void;
  // 文本提示信息
  message?: string;
  // 触发方式
  trigger?: string;
};

type OptionItem = {
  // 下拉框选项字段名
  label: string;
  // 下拉框选项数据值
  value: string | number;
  // 当输入框type为cascader时的子级options数组
  children?: any[];
};

type UploadConfig = {
  // 当输入框type为uploadImage时的表单模式
  uploadType?: "avatar" | "picture-card";
  // 文件大小限制
  size?: number;
  // 文件数量限制
  limit?: number;
  // 上传按钮样式是否为空心
  plain?: boolean;
  // 是否启用预览功能
  review?: boolean;
  // 是否开启只读模式
  readonly?: boolean;
};
